﻿// 1.在cmd使用常见的Windows命令
// 2.使用node执行js脚本文件
//  1.1编写js脚本，cmd定位到当前的目录，使用node 文件名来执行（文件名不能使用node.js）
// 3.node和浏览器里面的js引擎的区别，增加的能力和减少的能力
//4. js标准参考教程https: //wangdoc.com/javascript/
//https: //nodejs.org/dist/latest-v6.x/docs/api/child_process.html  nodejs官方文档
//5. 浏览器没有文件操作的能力， 而node有， readfile(): 如果读取失败， data就为null
// 6. < Buffer 0 d 0 a 0 d 0 a d3 c3 c4 a3 b0 e5 ca b1 c2 b7 be b6 b4 ed ce f3 b5 c4 ce ca cc e2 68 74 74 70 73 3 a 2 f 2 f 62 6 c 6 f 67 2e 63 73 64 6e 2e 6e 65 74 2 f 71 71...393 more bytes >
//     出现上述这个其实是二进制零和一转换成了十六进制， 需要用toString方法， 但用了只有英文能够正常显示， 汉字还是乱码
// 7. 乱码的原因是编码和解码不一致， 换一下编码解码方式即可， 记事本默认的编码方式是ANSI， 其实ANSI并不是某一种特定的字符编码， 而是在不同的系统中， ANSI表示不同的编码。 解决问题的话全部用utf - 8 吧， 记事本在另存为保存的时候可以设置编码
// 8.
var a = require("fs");
a.readFile("./node学习笔记.txt", function(error, data) {
        console.log(data.toString());
    })
    // 9. 创建一个文件夹， 并且在里面添加内容
var a = require("fs");
a.writeFile("./b.txt", "b文件", function(error) {
    console.log("hahah");
    console.log(error);
});
//10. 如果不答应出错误的话console.log(error);，
// 错误不会显示出来
// 11.
//     .如果有一条命令在缓慢执行， 如何停止当前命令的执行。
// ctrl + z
// 挂起当前进程
// 如果需要恢复到前台输入fg， 恢复到后台输入bg
// ctrl + c， 彻底终止该进程
// 12. 简单的http服务（ 只有请求， 没有响应）
var http = require('http');
var server = http.createServer();
server.on("request", function() {
    console.log("已经收到客户端的请求");

})
server.listen(3000, function() {
        console.log("服务器启动成功，可通过http://127.0.0.1:3000/在浏览器端访问，后面的路径不同但访问的结果是一样的");
    }) //绑定端口号
    // 13
    // 发送响应
var http = require('http');
var server = http.createServer();
//request 和response分别是请求和响应对象，response有个
//方法时write，调用了response方法后必须使用end方法，否则
//前面调用的方法不能成功.
//方法需要有两个形参，request和response，代码改变需要重启服务器
server.on("request", function(requst, response) {
    console.log("已经收到客户端的请求");
    console.log(requst.url);
    response.write("hello");
    response.end();

})
server.listen(3000, function() {
        console.log("服务器启动成功");
    }) //绑定端口号

// 浏览器加载网站的时候， 都会默认请求一个favicon.ico文件， 所以得到请求路径时有两个请求路径
// 14. 如果想要不同的请求路径时有不同的结果， 可以获得请求路径requst.url后来判断从而得编码不同的结果
// 15. 在a.js中加载b.js， 这样就可以执行两个js文件， a中代码如下:
console.log("a被执行了");
require("./b.js");
console.log("azhixingwanbi");
// 16. 模块作用域， 就是一个文件一个作用域， 不会污染其他的作用域， 内部访问不到外部， 外部也访问不到内部， 默认是封闭的， 但有时侯加载别的文件不是为了执行里面的代码， 而是需要加载某些变量， 方法
// 17. require方法有两个作用， 一是加载文件并执行里面的代码， 二是导出被加载文件模块的接口对象， 每个文件模块中都提供了一个模块对象exports, 默认是一个空对象， 加载别的文件的变量的话， 就需要将其挂载到exports上
// 18. a文件加载b文件的代码并且得到b文件的变量事例
// a文件：
var exp = require("./b.js");
console.log(exp.bb);
//b文件：
console.log("b被执行了");
var bb;
exports.bb = 0;
// 19. 端口号用来定义具体的程序， 所有联网的应用程序都会占用一个端口号
// 20. 乱码问题， 服务器发送的数据默认是utf8编码的，（ utf8是国标， 什么语言都认识）， 而浏览器不知道发送来的数据是什么编码的， 默认的是使用操作系统的编码， 中文Windows默认的是gbk的编码方式， 解决这个乱码问题就要设置编码方式， 浏览器才能知道， 代码如下：
var http = require("http");
var server = http.createServer();
server.on("request", function(req, res) {
    res.setHeader('Content-Type', 'text/plain;charset=utf-8');
    console.log(req.url);
    res.end("haha你好");
})
server.listen(3000, function() {
    console.log("服务器已经启动");
});
// 21. res.setHeader('Content-Type', 'text/plain;charset=utf-8');
// 解决乱码问题， 其中text / plain可以是text / html表示给浏览器发送的是HTML格式的字符串，返回不同的资源，对应的Content-Type不一样，可以在
//网址tool.oschina.net/commons  查看对应的Content-Type,代码如下：
var http = require("http");
var server = http.createServer();
server.on("request", function(req, res) {
    if (req.url === '/plain') {
        res.setHeader('Content-Type', 'text/plain;charset=utf-8');
        res.end("我是plain");
    } else if (req.url === '/html') {
        res.setHeader('Content-Type', 'text/html;charset=utf-8');
        res.end("<h1>我是html</h1>");
    }

    console.log(req.url);

})
server.listen(3000, function() {
    console.log("服务器已经启动");
});
//22.服务器怎么返回一个页面：renspond.end要返回字符串，不能返回文件，所以可以用读取文件的操作，data得到的是字符串，代码如下：var http = require("http");
var server = http.createServer();
var fs = require('fs');

server.on("request", function(req, res) {
    if (req.url === '/') {
        fs.readFile('./c.html', function(err, data) {
            if (err) {
                res.setHeader('Content-Type', 'text/plain;charset=utf-8');
                res.end("读取文件没有成功");
            } else {
                res.setHeader('Content-Type', 'text/html;charset=utf-8');
                res.end(data);
                //data默认是二进制数据，用。toString可以变成我们能认识的字符串；而res.end能支持两种类型，一种是字符串，另一种是二进制，
                //所以这里不需要变成字符串
            }
        })
    }

})
server.listen(3000, function() {
    console.log("服务器已经启动");
});
//23.服务器返回图片不需要指定编码，编码一般是指字符编码，返回图片代码如下：
var http = require("http");
var server = http.createServer();
var fs = require('fs');

server.on("request", function(req, res) {
    if (req.url === '/') {
        fs.readFile('./d.jpg', function(err, data) {
            if (err) {
                res.setHeader('Content-Type', 'text/plain;charset=utf-8');
                res.end("读取文件没有成功");
            } else {
                res.setHeader('Content-Type', 'image/jpeg');
                res.end(data);
                //data默认是二进制数据，用。toString可以变成我们能认识的字符串；而res.end能支持两种类型，一种是字符串，另一种是二进制，
                //所以这里不需要变成字符串
            }
        })
    }

})
server.listen(3000, function() {
    console.log("服务器已经启动");
});
//24
var http = require("http");
var server = http.createServer();
var fs = require('fs');

server.on("request", function(req, res) {
    if (req.url === '/') {
        fs.readFile('./c.html', function(err, data) {
            if (err) {
                res.setHeader('Content-Type', 'text/plain;charset=utf-8');
                return res.end("读取文件没有成功");
                //return第一个作用是返回值，第二个是可以阻止下面代码的执行，此处如果执行了return res.end("读取文件没有成功");
                //那么后面的console.log不会被执行
                //下面的res.end(data);前没有设置编码，可以在html页面里的meta那里设置：
                // <meta name="viewport" content="width=device-width, initial-scale=1.0" charset="utf-8">
            }
            console.log('后面执行了');
            res.end(data);
        })
    }

})
server.listen(3000, function() {
    console.log("服务器已经启动");
});
//25
var http = require("http");
var server = http.createServer();
var fs = require('fs');

server.on("request", function(req, res) {
    if (req.url === '/') {
        fs.readdir('./vscode workspace', function(err, files) {
            if (err) {
                res.setHeader('Content-Type', 'text/plain;charset=utf-8');
                return res.end("读取文件没有成功");
            }

            //readdir方法可以读取该文件里面所有文件的文件名，得到的是数组
            console.log(files);

            res.setHeader('Content-Type', 'text/plain;charset=utf-8');
            res.end(files.toString());
        })
    }

})
server.listen(3000, function() {
    console.log("服务器已经启动");
});
//26案例：将桌面上的文件夹里面的文件名动态显示到网页上，桌面上文件名变化则网页上也会变化，只需刷新
//文件a如下：
var http = require("http");
var server = http.createServer();
var fs = require('fs');

server.on("request", function(req, res) {
    if (req.url === '/') {
        fs.readFile('./c.html', function(err, data) { //这里的路径需要是c.html而不是c
            if (err) {
                res.setHeader('Content-Type', 'text/plain;charset=utf-8');
                return res.end("读取文件c没有成功");
            }

            fs.readdir('./vscode workspace', function(err, files) {
                if (err) {
                    res.setHeader('Content-Type', 'text/plain;charset=utf-8');
                    return res.end("读取文件vsw未成功");
                }
                var content = '';
                files.forEach(function(itme) {
                    content += `<p>${itme}</p>`; //es6的新特性，字符串里加入变量使用${}即可，注意此时外面的不是但引号而是1左边的那个
                });

                data = data.toString();
                data = data.replace('一', content);
                res.setHeader('Content-Type', 'text/html;charset=utf-8');
                res.end(data);
                console.log(files);
            })
        })
    }

})
server.listen(3000, function() {
    console.log("服务器已经启动");
});
//文件c如下：
// <!DOCTYPE html >
//     <html lang = "en" >

//     <head >
//     <meta charset = "UTF-8" >
//     <meta name = "viewport"content = "width=device-width, initial-scale=1.0"charset = "utf-8" >
//     <title > 6 - 4 < /title>
// <style >
//     div {
//         background - color: pink;
//         height: 300 px;
//         width: 300 px;
//     } 
//</style> 
//</head>

// <body >
//     <  div > 一 < /div> 
//<script >
//     var divs = document.getElementsByTagName('div');
// divs[0].onclick = function() {
//         divs[0].style.backgroundColor = 'red';
//         divs[0].style.width = '400px';
//     } 
//</script> 
//</body>
// </html>
//p24,p25,p26